home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / nops / Pex.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  161 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Nop::Pex;
  11. use strict;
  12. use base 'Msf::Nop';
  13. use Pex::Utils;
  14.  
  15. my $info = {
  16.   'Name'    => 'Pex Nop Generator',
  17.   'Version' => '$Revision: 1.19 $',
  18.   'Authors' => [ 'spoonm <ninjatools [at] hush.com>', ],
  19.   'Arch'    => [ 'x86' ],
  20.   'Desc'    =>  'The Pex library\'s x86 nop generator',
  21.   'Refs'    => [ ],
  22. };
  23.  
  24. my $advanced = {
  25.   'RandomNops' => [0, 'Use random nop equivalent instructions, otherwise default to 0x90'],
  26.  
  27. };
  28.  
  29. sub new {
  30.   my $class = shift; 
  31.   return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  32. }
  33.  
  34. sub Nops {
  35.   my $self = shift;
  36.   my $length = shift;
  37.  
  38.   my $exploit = $self->GetVar('_Exploit');
  39.   my $random  = $self->GetVar('RandomNops');
  40.   my $badRegs = $exploit->NopSaveRegs;
  41.   my $badChars = $exploit->PayloadBadChars;
  42.  
  43.   return($self->_PexNops($length,
  44.     {
  45.        'Arch' => 'x86',
  46.        'RandomNops' => $random,
  47.        'BadRegs' => $badRegs,
  48.        'BadChars' => $badChars,
  49.     }
  50.   ));
  51. }
  52.  
  53. #
  54. # Generate a nop sled for the appropriate architecture,
  55. # randomizing them by default by using nop-equivalents.
  56. #
  57.  
  58. # Nops(length, { opts });
  59. sub _PexNops {
  60.   my $defaultOpts = {
  61.     'Arch'       => 'x86',
  62.     'RandomNops' => 0,
  63. #    'BadRegs'    => ['esp', 'ebp'],
  64.   };
  65.   my $self = shift;
  66.   my $length = shift;
  67.   my $opts = @_ ? shift : { };
  68.   $opts = Pex::Utils::MergeHashRec($opts, $defaultOpts);
  69.   my $arch = $opts->{'Arch'};
  70.   my $random = $opts->{'RandomNops'};
  71.   my $badRegs = $opts->{'BadRegs'};
  72.   my $badChars = [ split('', $opts->{'BadChars'}) ];
  73.  
  74.   # Stole from ADMutate, thanks k2
  75.   # Bunch added and table built by spoon
  76.   my $nops = {'x86' => [
  77.    #[string, [ affected registers, ... ], ],
  78.     ["\x90", [ ], ], # nop
  79.     ["\x97", ['eax', 'edi'], ], # xchg eax,edi
  80.     ["\x96", ['eax', 'esi'], ], # xchg eax,esi
  81.     ["\x95", ['eax', 'ebp'], ], # xchg eax,ebp
  82.     ["\x93", ['eax', 'ebx'], ], # xchg eax,ebx
  83.     ["\x92", ['eax', 'edx'], ], # xchg eax,edx
  84.     ["\x91", ['eax', 'ecx'], ], # xchg eax,ecx
  85.     ["\x99", ['edx'], ], # cdq
  86.     ["\x4d", ['ebp'], ], # dec ebp
  87.     ["\x48", ['eax'], ], # dec eax
  88.     ["\x47", ['edi'], ], # inc edi
  89.     ["\x4f", ['edi'], ], # dec edi
  90.     ["\x40", ['eax'], ], # inc eax
  91.     ["\x41", ['ecx'], ], # inc ecx
  92.     ["\x37", ['eax'], ], # aaa
  93.     ["\x3f", ['eax'], ], # aas
  94.     ["\x27", ['eax'], ], # daa
  95.     ["\x2f", ['eax'], ], # das
  96.     ["\x46", ['esi'], ], # inc esi
  97.     ["\x4e", ['esi'], ], # dec esi
  98. #flag foo fixme
  99. #direction flag should be ok to change
  100.     ["\xfc", [ ], ], # cld
  101.     ["\xfd", [ ], ], # std
  102. #carry flag should be ok to change
  103.     ["\xf8", [ ], ], # clc
  104.     ["\xf9", [ ], ], # stc
  105.     ["\xf5", [ ], ], # cmc
  106.  
  107.     ["\x98", ['eax'], ], # cwde
  108.     ["\x9f", ['eax'], ], # lahf
  109.     ["\x4a", ['edx'], ], # dec edx
  110.     ["\x44", ['esp'], ], # inc esp
  111.     ["\x42", ['edx'], ], # inc edx
  112.     ["\x43", ['ebx'], ], # inc ebx
  113.     ["\x49", ['ecx'], ], # dec ecx
  114.     ["\x4b", ['ebx'], ], # dec ebx
  115.     ["\x45", ['ebp'], ], # inc ebp
  116.     ["\x4c", ['esp'], ], # dec esp
  117.     ["\x9b", [ ], ], # wait
  118.     ["\x60", ['esp'], ], # pusha
  119.     ["\x0e", ['esp'], ], # push cs
  120.     ["\x1e", ['esp'], ], # push ds
  121.     ["\x50", ['esp'], ], # push eax
  122.     ["\x55", ['esp'], ], # push ebp
  123.     ["\x53", ['esp'], ], # push ebx
  124.     ["\x51", ['esp'], ], # push ecx
  125.     ["\x57", ['esp'], ], # push edi
  126.     ["\x52", ['esp'], ], # push edx
  127.     ["\x06", ['esp'], ], # push es
  128.     ["\x56", ['esp'], ], # push esi
  129.     ["\x54", ['esp'], ], # push esp
  130.     ["\x16", ['esp'], ], # push ss
  131.     ["\x58", ['esp', 'eax'], ], # pop eax
  132.     ["\x5d", ['esp', 'ebp'], ], # pop ebp
  133.     ["\x5b", ['esp', 'ebx'], ], # pop ebx
  134.     ["\x59", ['esp', 'ecx'], ], # pop ecx
  135.     ["\x5f", ['esp', 'edi'], ], # pop edi
  136.     ["\x5a", ['esp', 'edx'], ], # pop edx
  137.     ["\x5e", ['esp', 'esi'], ], # pop esi
  138.     ["\xd6", ['eax'], ], # salc
  139.   ],};
  140.  
  141.   return undef if(!exists($nops->{$arch}));
  142.  
  143.   my @nops;
  144.   foreach my $nop (@{$nops->{$arch}}) {
  145.     if(!Pex::Utils::ArrayContains($nop->[1], $badRegs) && !Pex::Utils::ArrayContains($badChars, [$nop->[0]])) {
  146.       push(@nops, $nop->[0]);
  147.     }
  148.     else {
  149. #      print "Dropped.\n";
  150.     }
  151.   }
  152.  
  153.   return if(!@nops);
  154.  
  155.   return ($nops[0] x $length) if (! $random);
  156.   return join ("", @nops[ map { rand @nops } ( 1 .. $length )]);
  157. }
  158.  
  159.  
  160. 1;
  161.